#include "pch.hpp"
#include "Dialog.hpp"

#include "VerticalLayout.hpp"
#include "HorizontalLayout.hpp"
#include "PushButton.hpp"




QString StandardButton::text(Type type)
{
	switch(type)
	{
	case Ok:     return "Ok";
	case Cancel: return "Cancel";
	case Yes:    return "Yes";
	case No:     return "No";
	case Apply:  return "Apply";
	default: BOOSTEXT_THROW(invalid_value_exception(type));
	}
}
///////////////////////////////////////////////////////////////////////////////////////////////////




Dialog::Dialog(const QString& text, const QString& title, Desktop* parent, Widgets::Type finalType /*= Widgets::Dialog*/)
	: Window(title, parent, finalType)
	, m_modal(false)
	, m_caption(new Text(text, this, Widgets::Text))
	, m_buttons(new Widget(this, Widgets::Widget))
{
	if(finalType == type())
		updateStyle();

	LayoutPtr vLayout(new VerticalLayout(this));
	setLayout(vLayout);

	vLayout->add(m_caption);
	vLayout->add(m_buttons);

	LayoutPtr hLayout(new HorizontalLayout(m_buttons.get()));
	m_buttons->setLayout(hLayout);
}
///////////////////////////////////////////////////////////////////////////////////////////////////

Dialog::~Dialog()
{}
///////////////////////////////////////////////////////////////////////////////////////////////////




Dialog::OptButton Dialog::doModal()
{
	if(!m_modal) return m_clickedButton;
	else         return OptButton();
}
///////////////////////////////////////////////////////////////////////////////////////////////////

void Dialog::forceClick(StandardButton::Type which)
{
	m_clickedButton = which;
}
///////////////////////////////////////////////////////////////////////////////////////////////////




void Dialog::setCaption(const QString& text)
{
	m_caption->setText(text);
}
///////////////////////////////////////////////////////////////////////////////////////////////////




void Dialog::addButton(StandardButton::Type which)
{
	LayoutPtr hLayout = m_buttons->layout();
	WidgetStylePtr widgetStyle = style();
	QString text = StandardButton::text(which);

	PushButtonPtr button(new PushButton(text, m_buttons.get()));
	button->setMinimumSize(button->size());
	button->setMaximumSize(button->size());
	button->mouseClicked.connect(boost::bind(&Dialog::onButtonClicked, this, _1, which));

	hLayout->add(button);
	m_buttonList << button;
}
///////////////////////////////////////////////////////////////////////////////////////////////////

void Dialog::addButtons(StandardButtons buttons)
{
	foreach(StandardButton::Type which, buttons)
	{
		addButton(which);
	}
}
///////////////////////////////////////////////////////////////////////////////////////////////////




Widgets::Type Dialog::type() const
{
	return Widgets::Dialog;
}
///////////////////////////////////////////////////////////////////////////////////////////////////

void Dialog::update(NestedState& state)
{
	Window::update(state);

	if(!m_clickedButton && !m_modal)
	{
		state.setModalWidget(this);
		m_modal = true;
	}

	if(m_clickedButton && m_modal)
	{
		state.unsetModalWidget(this);
		m_modal = false;
	}
}
///////////////////////////////////////////////////////////////////////////////////////////////////




void Dialog::onButtonClicked(Widget*, StandardButton::Type which)
{
	m_clickedButton = which;
}
///////////////////////////////////////////////////////////////////////////////////////////////////
